Call by Reference & Call by Sharing


Posted by hoyi-23 on 2021-08-12

求質策略

JavaScript是一個動態型別的語言,它的型別會在執行過程中不斷地轉換,代表當在執行階段才會被賦予型別。這個被動態賦予的型別又分為兩大類
原始型別與物件型別
當變數的值是 原生型別(primitive),行為是傳值。
當變數的值是 物件(object),行為是傳參考。

傳質(Call by Value)

用拷貝的方式,所以修改不會互相影響。

var x = 5;
var y = x;
console.log(x,y) // 5,5

x=10;
console.log(x,y) // 10 ,5

傳參照呼叫(Call by Reference)

-和傳值不同的是,傳參照不是拷貝是 "傳參數位置",修改會互相影響

var person 1 = {num:111};
var person2 = person 1;
console.log(person 1, person 2) // {num:111},{num:111}

person 1.num = 222;
console.log(person 1, person 2) // {num:222},{num:222}

傳共用物件呼叫(Call by Sharing)

像是前兩種的融合。雖然是物件型別,但對其一物件變數做重新賦值時,不會互相影響。

  • 不是拷貝'不是傳參數,不會互相影響
    ```
    var person 1 = {num:111};
    var person2 = person 1;
    console.log(person 1, person 2) // {num:111},{num:111}

var person 3 = {num:333};
perons 1 = person 3;

console.log(person 1, person 2,person 3)//{num:333},{num:111},{num:333}

這裡跟 Call by Reference 不同的地方是 **重新賦值**。

-----

例題:

function changeAge(person) {
person.age = 25;
return person
}
var personObj1 = {
name: 'Charles',
age: 30
};
var personObj2 = changeAge(personObj1);
console.log(personObj1); // { name: 'Charles', age: 25 }
console.log(personObj2); // { name: 'Charles', age: 25 }


function changeAge(person) {
person.age = 25;
person = {
name: 'John',
age: 50
}
return person
}
var personObj1 = {
name: 'Charles',
age: 30
};
var personObj2 = changeAge(personObj1);
console.log(personObj1);
console.log(personObj2);
```


#傳值 #傳參考







Related Posts

Vite 怎麼能那麼快?從 ES modules 開始談起

Vite 怎麼能那麼快?從 ES modules 開始談起

2356. Number of Unique Subjects Taught by Each Teacher

2356. Number of Unique Subjects Taught by Each Teacher

命題邏輯(Propositional Logic)

命題邏輯(Propositional Logic)


Comments